package 设计模式;

/**
 * @author shy_black
 * @date 2019/3/9 20:47
 * @Description:工厂方法模式
 * 横向扩展方便
 * 定义一个用来创建对象的接口，让子类决定实例化哪个类
 * 针对每个产品（产品族）提供一个工厂类，客户端需要判断使用哪个工厂
 * 一个抽象产品类
 * 多个具体产品类
 * 一个抽象工厂（针对抽象产品类）
 * 多个具体工厂（每个产品家族拥有自己的工厂）
 */
public class 工厂方法模式 {
    public static void main(String[] args) {
        ComputerFactory_1 factory_1 = new AppleFactory();
        Computer_1 computer_1 = factory_1.createComputer();
        computer_1.printComputer();
    }
}

interface Computer_1 {
    void printComputer();
}

class MacBook_1 implements Computer_1 {

    @Override
    public void printComputer() {
        System.out.println("This is a Macbook.");
    }
}

class SurfaceBook_1 implements Computer_1 {

    @Override
    public void printComputer() {
        System.out.println("This is a surfaceBook");
    }
}

class Dell_1 implements Computer_1 {
    @Override
    public void printComputer() {
        System.out.println("This is a Dell");
    }

}
//抽象工厂类
interface ComputerFactory_1 {
    Computer_1 createComputer();
}
//微软工厂类
class MsFactory implements ComputerFactory_1 {

    @Override
    public Computer_1 createComputer() {
        return new SurfaceBook_1();
    }
}
//Apple工厂类
class AppleFactory implements ComputerFactory_1 {

    @Override
    public Computer_1 createComputer() {
        return new MacBook_1();
    }
}